public class WinOrLoss {
    /*
    判断五子棋输赢关键在四个方向
    1.行上下方向，定义方法winRow
    2.列左右方向，定义方法winCol
    3.左上到右下方向，定义方法winLeftUpToRightDown
    4.右上到左下方向，定义方法winRightUpToLeftDown
     */

    public static boolean winRow(String[][] garray, final int row, final int col) {
        // 判断行相连
        // 如果行左的值与该值相等，wincount加一，wincount大于等于5为赢
        // row-4>=0为了防止越界
        // 越界或相邻的两个位置不相等则退出循环
        int rowcount = 1;
        // 向行上方判断
        for (int i = 1; i <= 4; i++) {
            if (row-i >= 0 && garray[row][col] == garray[row-i][col]) {
                rowcount++;
            } else {
                break;
            }
        }
        // 向行下方判断
        for (int i = 1; i <= 4 ; i++) {
            if (row+i < garray[0].length && garray[row][col] == garray[row+i][col]) {
                rowcount++;
            } else {
                break;
            }
        }
        // 如果统计数大于等于5，则判断胜出，返回true
        return rowcount >= 5? true: false;
    }

    public static boolean winCol(String[][] garray, final int row, final int col) {
        // 判断列相连
        // 如果相邻列的值相等，wincount加一，wincount大于等于5为赢
        // col-i>=0和col+i<garray[0].length为了防止越界
        // 越界或相邻的两个位置不相等则退出循环
        int colcount = 1;
        // 向列的左方判断
        for (int i = 1; i <= 4; i++) {
            if (col-i >= 0 && garray[row][col] == garray[row][col-i]) {
                colcount++;
            } else {
                break;
            }
        }
        // 向列的右方判断
        for (int i = 1; i <= 4 ; i++) {
            if (col+i < garray[0].length && garray[row][col] == garray[row][col+i]) {
                colcount++;
            } else {
                break;
            }
        }
        // 如果统计数大于等于5，则判断胜出，返回true
        return colcount >= 5? true: false;
    }

    public static boolean winLeftUpToRightDown(String[][] garray, final int row, final int col) {
        // 判断左上到右下的相连
        // 如果相邻列的值相等，wincount加一，wincount大于等于5为赢
        // 越界或相邻的两个位置不相等则退出循环
        int leftcount = 1;
        // 向左上方判断，行列均减
        // col-i >= 0 && row-i >= 0为了防止越界
        for (int i = 1; i <= 4; i++) {
            if (col-i >= 0 && row-i >= 0 && garray[row][col] == garray[row-i][col-i]) {
                leftcount++;
            } else {
                break;
            }
        }
        // 向右下方判断，行列均加
        // col+i < garray[0].length && row+i < garray[0].length 判断是否越界
        for (int i = 1; i <= 4 ; i++) {
            if (col+i < garray[0].length && row+i < garray[0].length && garray[row][col] == garray[row+i][col+i]) {
                leftcount++;
            } else {
                break;
            }
        }
        // 如果统计数大于等于5，则判断胜出，返回true
        return leftcount >= 5? true: false;
    }

    public static boolean winRightUpToLeftDown(String[][] garray, final int row, final int col) {
        // 判断右上到左下的相连
        // 如果相邻列的值相等，wincount加一，wincount大于等于5为赢
        // 越界或相邻的两个位置不相等则退出循环
        int rightcount = 1;
        // 向右上方判断，列是增，行是减
        // col+i < garray[0].length && row-i >= 0为了防止越界
        for (int i = 1; i <= 4; i++) {
            if (col+i < garray[0].length && row-i >= 0 && garray[row][col] == garray[row-i][col+i]) {
                rightcount++;
            } else {
                break;
            }
        }
        // 向左下方判断，列是减，行是增
        // col+i <= garray[0].length && row+i <= garray[0].length 判断是否越界
        for (int i = 1; i <= 4 ; i++) {
            if (col-i >= 0 && row+i < garray[0].length && garray[row][col] == garray[row+i][col-i]) {
                rightcount++;
            } else {
                break;
            }
        }
        // 如果统计数大于等于5，则判断胜出，返回true
        return rightcount >= 5? true: false;
    }

    public static boolean gameWinOrLoss(String[][] garray, final int row, final int col) {
        // 将参数传给四个判断方法，如果其中一个返回true，则判断为win，返回true
        if (winRow(garray,row,col) || winCol(garray,row,col)
            || winLeftUpToRightDown(garray,row,col) || winRightUpToLeftDown(garray,row,col)) {
            return true;
        } else {
            return false;
        }
    }
}
